package br.ufrn.projetoDB.gerenciadorGaragem.persistencia.DAO;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;

import br.ufrn.projetoDB.gerenciadorGaragem.dominio.MarcaVeiculo;
import br.ufrn.projetoDB.gerenciadorGaragem.dominio.ModeloVeiculo;
import br.ufrn.projetoDB.gerenciadorGaragem.dominio.TipoVeiculo;
import br.ufrn.projetoDB.gerenciadorGaragem.dominio.Veiculo;
import br.ufrn.projetoDB.gerenciadorGaragem.persistencia.util.ConnectionFactory;

public class VeiculoDAO {

	private Connection c;
	
	public VeiculoDAO() {
		c = new ConnectionFactory().getConnection();
	}
	
	public HashMap<Integer,String> getAllTiposVeiculos () throws SQLException{
		
		PreparedStatement p = c.prepareStatement("SELECT t.id_tipoveiculo, t.tipo, count(t.id_tipoveiculo) "+
													"FROM comum.veiculo v " + 
													"INNER JOIN comum.modeloVeiculo m on v.id_veiculo=m.id_modelo "+
													"INNER JOIN comum.TipoVeiculo t on m.id_tipoveiculo=t.id_tipoveiculo "+
													"GROUP BY t.id_tipoveiculo,t.tipo");
		
		ResultSet rs = p.executeQuery();
		
		HashMap<Integer,String> result = new HashMap<Integer,String>();
		
		if (rs == null)
			return null;
		
		while (rs.next()) {
			result.put(rs.getInt("id_tipoveiculo"), rs.getString("tipo")+"("+rs.getInt("count")+")");
		}
		
		return result;
		
	}
	
	public List<Veiculo> getAllVeiculosDisponiveis(Integer idTipoVeiculo, Date saida, Date chegada) throws SQLException{
		List<Veiculo> result = new ArrayList<Veiculo>();
		
		PreparedStatement p = c.prepareStatement("SELECT v.id_veiculo, m.id_modelo, m.nome, t.id_tipoveiculo, mv.id_marca, t.capacidadecarga, t.numpassageiros, t.tipo, mv.marca " +
													"FROM comum.veiculo v " +
													"INNER JOIN comum.modeloVeiculo m on v.id_veiculo=m.id_modelo " +
													"INNER JOIN comum.TipoVeiculo t on m.id_tipoveiculo=t.id_tipoveiculo " +
													"INNER JOIN comum.marcaVeiculo mv on m.id_marca=mv.id_marca " +
													"WHERE v.id_veiculo NOT IN (SELECT r.id_veiculo " +
																					"FROM negocio.registro r " +
																					"WHERE (? BETWEEN r.data_saida AND r.data_chegada)" +
																							" OR (? BETWEEN r.data_saida AND r.data_chegada)) " +
														"AND m.id_tipoVeiculo = ?");

		p.setInt(3, idTipoVeiculo);
		p.setDate(1, (java.sql.Date) saida);
		p.setDate(2, (java.sql.Date) chegada);
		ResultSet rs = p.executeQuery();
		
		if (rs == null)
			return null;
		
		while (rs.next()) {
			Veiculo v = new Veiculo(rs.getInt("id_veiculo"));
			v.setModelo(new ModeloVeiculo(rs.getInt("id_modelo")));
			v.getModelo().setNome(rs.getString("nome"));
			v.getModelo().setMarca(new MarcaVeiculo(rs.getInt("id_marca")));
			v.getModelo().getMarca().setMarca(rs.getString("marca"));
			v.getModelo().setTipo(new TipoVeiculo(rs.getInt("id_tipoveiculo")));
			v.getModelo().getTipo().setTipo(rs.getString("tipo"));
			v.getModelo().getTipo().setCapacidadeCarga(rs.getDouble("capacidadecarga"));
			v.getModelo().getTipo().setNumPassageiros(rs.getInt("numpassageiros"));
			
			result.add(v);
		}
		
		return result;
	}
	
}
